package ltd.dujiabao.activemq.jms;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import javax.jms.*;
import java.util.Random;

/**
 * @author : DuJiabao
 * @Project : active-mq
 * @Time : 2021/5/4 18:44
 * @Desc :
 */
public class JMSProducer {
  private static final String ACTIVEMQ_URL = "tcp://192.168.233.134:61616";  // 服务器端口号，地址
  private static final String DESTINATION_NAME = "queue01";  // 目的地名称
  private ActiveMQConnectionFactory activeMQConnectionFactory;
  private Connection connection = null;
  private Session session = null;
  private MessageProducer producer = null;

  @Before
  public void before() throws JMSException {
    activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
    connection = activeMQConnectionFactory.createConnection();
    connection.start();
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 不使用事务，使用自动签收
  }

  /**
   * 设置消息头
   *
   * @throws JMSException
   */
  @Test
  public void test1() throws JMSException {
    // 通过session把角色都创建出来
    Queue queue = session.createQueue(DESTINATION_NAME);  // 创建一个消息队列出来，也就是目的地
    producer = session.createProducer(queue);  // 把目的地放进生产者里面
    Random random = new Random();
    // 发送消息
    for (int i = 0; i < 10; i++) {
      TextMessage message = session.createTextMessage("message:" + i);// 创建一个要发送的消息对象，该对象存储的是字符串
      //// 给每条消息单独定制一个目的地
      //message.setJMSDestination(session.createQueue("queue" + i));
      //// 持久模式和非持久模式
      //message.setJMSDeliveryMode(DeliveryMode.PERSISTENT);  // 默认情况，持久化
      //message.setJMSDeliveryMode(DeliveryMode.PERSISTENT); // 非持久化
      ////// 过期时间
      //message.setJMSExpiration(1000L);  // ms
      ////// 消息优先级  0-9
      //message.setJMSPriority(random.nextInt(10) - 1);  // 0-9 优先级都试一遍
      //// 设置消息唯一标识
      //message.setJMSMessageID("message" + i);
      producer.send(message, DeliveryMode.NON_PERSISTENT, 9, 10000);// 生产者负责将消息对象发送出去
    }
    System.out.println("发送消息完毕");
  }

  /**
   * 设置消息体，可以有不同类型
   *
   * @throws JMSException
   */
  @Test
  public void test2() throws JMSException {
    Queue queue = session.createQueue(DESTINATION_NAME);
    producer = session.createProducer(queue);

    MapMessage mapMessage = session.createMapMessage();
    mapMessage.setInt("int", 10);
    mapMessage.setBoolean("boolean", true);
    mapMessage.setString("string", "string");
    producer.send(mapMessage);
    System.out.println("发送完毕");
  }

  /**
   * 设置消息属性，可以自定义
   *
   * @throws JMSException
   */
  @Test
  public void test3() throws JMSException {
    Queue queue = session.createQueue(DESTINATION_NAME);
    producer = session.createProducer(queue);
    TextMessage textMessage = session.createTextMessage("textMessage");
    textMessage.setIntProperty("int_property", 10);
    textMessage.setBooleanProperty("boolean_property", false);
    textMessage.setStringProperty("string_property", "string");
    producer.send(textMessage);
    System.out.println("发送完毕");
  }

  /**
   * 测试queue消息非持久化的效果
   */
  @Test
  public void test4() throws JMSException {
    // 通过session把角色都创建出来
    Queue queue = session.createQueue(DESTINATION_NAME);  // 创建一个消息队列出来，也就是目的地
    producer = session.createProducer(queue);  // 把目的地放进生产者里面

    producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);  // 将生产者设置为非持久的
    //producer.setDeliveryMode(DeliveryMode.PERSISTENT);  // 将生产者设置为持久的

    // 发送消息
    for (int i = 0; i < 10; i++) {
      TextMessage message = session.createTextMessage("message:" + i);// 创建一个要发送的消息对象，该对象存储的是字符串
      producer.send(message);// 生产者负责将消息对象发送出去
    }
    System.out.println("发送消息完毕");
  }

  @After
  public void after() throws JMSException {
    // 关闭资源
    producer.close();
    session.close();
    connection.close();
    System.out.println("资源关闭完毕");
  }
}
